package IO流.综合练习.带权重的随机点名;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

public class 点名 {
    public static void main(String[] args) throws IOException {
        //1.读取所有的学生信息，并且添加到学生集合中
        //创建一个集合存储学生
        ArrayList<Student> stuList=new ArrayList<>();
        BufferedReader br=new BufferedReader(new FileReader("F\\name.txt"));
        String line;
        while ((line=br.readLine())!=null){
            String[] s = line.split("-");
            //创建学生对象
            Student stu=new Student(s[0],s[1],Integer.parseInt(s[2]),Double.parseDouble(s[3]));
            //添加学生对象到集合中
            stuList.add(stu);
        }
        //2.计算总权重--->每个人所占权重的和
        //创建一个变量记录总的权重
        double sum=0;
        for (Student student : stuList) {
            sum+=student.getWeight();
        }
        //3.记录每个人所占的权重
        //创建一个数组,记录每个人所占的权重的大小
        double[] weightArr=new double[stuList.size()];
        //创建一个变量记录索引
        int index=0;
        for (Student student : stuList) {
            weightArr[index]=student.getWeight()/sum;
            index++;
        }
       //4.计算每个权重所占的范围--->这个权重在在总权重中的范围长度的大小.
        //[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
        for (int i = 1; i < weightArr.length; i++) {
            weightArr[i]=weightArr[i]+weightArr[i-1];
        }
        //5.生成一个在0-1之间的随机小数进行点名.
        double random = Math.random();
        //6.通过二分法查找在中的位置
        int i = -Arrays.binarySearch(weightArr, random)-1;
        //修改被点到名的学生的权重
        double weight = stuList.get(i).getWeight() / 2;
        stuList.get(i).setWeight(weight);
        //打印被点到名的学生
        System.out.println(stuList.get(i));
        //7.修改文件中每个学生的权重
        BufferedWriter bw=new BufferedWriter(new FileWriter("F\\name.txt"));
        for (Student student : stuList) {
            bw.write(student.toString());
            bw.newLine();
        }
        //8.释放资源源
        bw.close();
        br.close();
    }
}
